

package com.hazelcast.map.impl;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.hazelcast.core.HazelcastJsonValue;
import com.hazelcast.internal.serialization.Data;
import com.hazelcast.json.internal.JsonSchemaHelper;

import java.io.ByteArrayInputStream;
import java.io.IOException;

import static com.hazelcast.internal.serialization.impl.HeapData.HEAP_DATA_OVERHEAD;

public class JsonMetadataInitializer implements MetadataInitializer {

    public static final JsonMetadataInitializer INSTANCE = new JsonMetadataInitializer();

    private static final int UTF_CHAR_COUNT_FIELD_SIZE = 4;

    private static final JsonFactory FACTORY = new JsonFactory();

    @Override
    public Object createFromData(Data data) throws IOException {
        if (data.isJson()) {
            try (JsonParser parser = FACTORY.createParser(new ByteArrayInputStream(data.toByteArray(), HEAP_DATA_OVERHEAD + UTF_CHAR_COUNT_FIELD_SIZE, data.dataSize() - UTF_CHAR_COUNT_FIELD_SIZE))) {
                return JsonSchemaHelper.createSchema(parser);
            }
        }
        return null;
    }

    @Override
    public Object createFromObject(Object obj) throws IOException {
        if (obj instanceof HazelcastJsonValue) {
            String str = obj.toString();
            try (JsonParser parser = FACTORY.createParser(str)) {
                return JsonSchemaHelper.createSchema(parser);
            }
        }
        return null;
    }
}
